Library.WebControl.Effect = (function() {
  var effects = new Array();
  var internalId = Number.MIN_VALUE;
  function GetHash(i) {
    for (var j = 0; j < effects.length; j++) {
      if (effects[j].I == i) {
        return effects[j];
      }
    }

    return null;
  };
  function RemoveHash(i) {
    for (var j = 0; j < effects.length; j++) {
      if (effects[j].I == i) {
        effects.splice(j, 1);
        return;
      }
    }
  };
  function SetDefaultObj(o) {
    var v = SetDefault(o);
    if (v.V.Type == '0') {//normal display
      return v;
    }
    v.Exist = null;
    var eh = GetHash(v.I);
    if (eh != null) {
      RemoveHash(v.I);
      v.Exist = eh;
    }
    effects.push(v);
    return v;
  };
  function SetDefault(o) {
    internalId++;
    var objId = "Library.WebControl.Effect.Obj." + internalId;
    if (typeof (o.Object) == 'string') {
      objId = o.Object;
      o.Object = Library.WebControl.Util.GetObjectById(o.Object);
    }
    else {
      var oId = o.Object.getAttribute("Id");
      if (oId != null && oId != "") {
        objId = oId;
      }
    }
    if (!o.Type) {
      o.Type = '0'; // default is normal
    }
    if (!o.Time) {
      o.Time = 10;
    }
    if (!o.Vision) {
      o.Vision = 'D';
    }

    if (!o.Step) {
      o.Step = 1;

    }
    if (!o.StepIncrease) o.StepIncrease = 0;
    if (!o.MinSize) o.MinSize = 0;
    if (o.Type == '5' || o.Type == '6') {
      if (typeof (o.Step) == "number") {
        o.OriStep = o.Step;
        o.Step = ScaleSize(Library.WebControl.Util.GetSize(o.Object), o.Step);
      }
      if (typeof (o.MinSize) == "number") {
        o.MinSize = { Width: o.MinSize, Height: o.MinSize };
      }
    }
    /*switch (o.Type) {
    case '3':
    case '4':
    case '5':
    case '6':
    o.OverFlow = o.Object.style.overflow;
    //o.Object.style.overflow = "hidden";
    break;
    }*/

    o.OverFlow = o.Object.style.overflow;
    var v = new Object();
    v.V = o;
    if (!v.V.StepShown) v.V.StepShown = function(s, e) { };
    if (!v.V.StepHidden) v.V.StepHidden = function(s, e) { };

    //var h = v;
    if (!v.V.ShowComplete) {
      v.V.ShowComplete = function(s, e) { };
    } else {
      var previewShowCompleteFunction = v.V.ShowComplete;
      v.V.ShowComplete = function(s, e) {
        o.Object.style.overflow = o.OverFlow;
        previewShowCompleteFunction(s, e);
      };
    }
    if (!v.V.HideComplete) {
      v.V.HideComplete = function(s, e) { };
    } else {
      var previewViewHideCompleteFunction = v.V.HideComplete;
      v.V.HideComplete = function(s, e) {
        o.Object.style.overflow = o.OverFlow;
        previewViewHideCompleteFunction(s, e);
      };
    }
    v.ResetW = v.V.Object.style.width == "";
    v.ResetH = v.V.Object.style.height == "";
    if (v.V.Type == '0') {//normal display
      return v;
    }
    v.I = objId;
    return v;
  };
  function ScaleSize(size, factor) {
    //var size = Library.WebControl.Util.GetSize(obj);
    if (size.W > size.H) {
      return {
        Width: factor * size.W / size.H,
        Height: factor
      };
    }
    else {
      return {
        Width: factor,
        Height: factor * size.H / size.W
      };
    }
  };
  function CheckProperty(a, p) {
    if (!a) {
      alert('init ' + p + ' in parameter first');
      return false;
    }
    return true;
  };
  function ActualHide(h) {
    switch (h.V.Vision) {
      case 'D':
        h.V.Object.style.display = 'none';
        break;
      case 'V':
        h.V.Object.style.visibility = 'hidden';
        break;
    }
    h.Timer = 0;
  };
  function Hide(h) {
    var ext = h.Exist;
    if (ext != null) {
      if (ext.Timer) {
        window.clearTimeout(ext.Timer);
        ext.Timer = 0;
      }
    }
    h.V.Object.style.overflow = "hidden";
    switch (h.V.Type) {
      case '0':
        ActualHide(h);
        h.V.HideComplete(h.V.Object, {});
        break;
      case '1':

        if (ext != null) {
          h.R = ext.R;
        }
        else {
          h.R = 100;
        }
        BackgroundHide(h);
        break;
      case '2':
        h.V.Object.style.overflow = "hidden";
        if (ext == null) {
          h.Index = h.V.Object.childNodes.length - 1;
        }
        else {
          h.Index = ext.Index;
        }
        ChildHide(h);
        break;
      case '3':
        if (!CheckProperty(h.V.ObjHeight, 'ObjHeight')) {
          RemoveHash(h.I);
          return;
        }

        if (ext == null) {
          h.Size = h.V.ObjHeight;
        }
        else {
          h.Size = ext.Size;
        }
        HeighHide(h);
        break;
      case '4':
        if (!CheckProperty(h.V.ObjWidth, 'ObjWidth')) {
          RemoveHash(h.I);
          return;
        }
        if (ext == null) {
          h.Size = h.V.ObjWidth;
        }
        else {
          h.Size = ext.Size;
        }
        WidthHide(h);
        break;
      case '5':
        if (!CheckProperty(h.V.ObjWidth, 'ObjWidth') || !CheckProperty(h.V.ObjHeight, 'ObjHeight')) {
          RemoveHash(h.I);
          return;
        }
        if (ext == null) {
          h.Size = [h.V.ObjWidth, h.V.ObjHeight];
        }
        else {
          h.Size = ext.Size;
        }

        WidthAndHeightHide(h);
        break;
      case '6':
        if (!CheckProperty(h.V.ObjWidth, 'ObjWidth') || !CheckProperty(h.V.ObjHeight, 'ObjHeight')) {
          RemoveHash(h.I);
          return;
        }
        if (ext == null) {
          h.Size = [h.V.ObjWidth, h.V.ObjHeight];
          h.CurPos = Library.WebControl.Util.GetPosition(h.V.Object);
        }
        else {
          h.Size = ext.Size;
          h.CurPos = ext.CurPos;
          h.CurPos = Library.WebControl.Util.GetPosition(h.V.Object);
        }

        ZoomHide(h);
        break;
    }
  };
  function WidthAndHeightHide(h) {
    if (h.Size[0] > h.V.MinSize.Width || h.Size[1] > h.V.MinSize.Height) {
      if (h.Size[0] > h.V.MinSize.Width) {
        h.Size[0] -= h.V.Step.Width;
      }
      if (h.Size[0] < h.V.MinSize.Width)
        h.Size[0] = h.V.MinSize.Width;
      if (h.Size[1] > h.V.MinSize.Height) {
        h.Size[1] -= h.V.Step.Height;
      }
      if (h.Size[1] < h.V.MinSize.Height)
        h.Size[1] = h.V.MinSize.Height;
      h.V.Object.style.width = h.Size[0] + 'px';
      h.V.Object.style.height = h.Size[1] + 'px';
      h.V.StepHidden(h.V.Object, {});
      h.Timer = setTimeout(function() {
        WidthAndHeightHide(h);
      }, h.V.Time);

    }
    else {
      h.V.Object.style.width = h.ResetW ? "" : h.V.ObjWidth + "px";
      h.V.Object.style.height = h.ResetH ? "" : h.V.ObjHeight + "px";
      RemoveHash(h.I);
      ActualHide(h);
      h.V.HideComplete(h.V.Object, {});
    }
  };
  function HeighHide(h) {
    if (h.Size > h.V.MinSize) {
      h.Size -= h.V.Step;
      if (h.Size < h.V.MinSize)
        h.Size = h.V.MinSize;
      h.V.Object.style.height = h.Size + 'px';
      h.V.StepHidden(h.V.Object, {});
      h.Timer = setTimeout(function() {
        HeighHide(h);
      }, h.V.Time);

    }
    else {
      h.V.Object.style.height = h.ResetH ? "" : h.V.ObjHeight + "px";
      RemoveHash(h.I);
      ActualHide(h);
      h.V.HideComplete(h.V.Object, {});
    }
  };
  function WidthHide(h) {
    if (h.Size > h.V.MinSize) {
      h.Size -= h.V.Step;
      if (h.Size < h.V.MinSize)
        h.Size = h.V.MinSize;
      h.V.Object.style.width = h.Size + 'px';
      h.V.StepHidden(h.V.Object, {});
      h.Timer = setTimeout(function() {
        WidthHide(h);
      }, h.V.Time);

    }
    else {
      //h.V.Object.style.width = "";
      h.V.Object.style.width = h.ResetW ? "" : h.V.ObjWidth + "px";
      //h.V.Object.style.height = h.ResetH ? "" : h.V.ObjHeight + "px";
      RemoveHash(h.I);
      ActualHide(h);
      h.V.HideComplete(h.V.Object, {});
    }
  };
  function BackgroundHide(h) {
    if (h.R > h.V.MinSize) {
      h.R -= h.V.Step;
      var d = h.V.Object;
      d.style.filter = 'alpha(opacity=' + h.R + ')';
      if (h.R > 9) {
        d.style.opacity = '0.' + h.R;
      }
      else {
        d.style.opacity = '0.0' + h.R;
      }
      h.V.StepHidden(h.V.Object, {});
      h.Timer = setTimeout(function() {
        BackgroundHide(h);
      }, h.V.Time);

    }
    else {
      RemoveHash(h.I);
      ActualHide(h);
      h.V.HideComplete(h.V.Object, {});

      //RemoveHash(h.I);
      //h.V.HideComplete(h.V.Object, {});
    }
  };
  function ChildHide(h) {
    if (h.Index >= h.V.MinSize && h.Index < h.V.Object.childNodes.length) {
      var n = h.V.Object.childNodes[h.Index];
      if (n.nodeType == 1) //element node
        n.style.display = 'none';
      h.Index--;
      h.V.StepHidden(h.V.Object, {});
      h.Timer = setTimeout(function() {
        ChildHide(h);
      }, h.V.Time);
    }
    else {
      ActualHide(h);
      RemoveHash(h.I);
      h.V.HideComplete(h.V.Object, {});
    }
  };
  function ZoomHide(h) {
    var wz = h.Size[0] - 2 * h.V.Step.Width;
    var hz = h.Size[1] - 2 * h.V.Step.Height;
    if (hz >= h.V.MinSize.Height && wz >= h.V.MinSize.Width) {
      var pos = h.CurPos; //Library.WebControl.Util.GetPosition(h.V.Object);
      pos.X = pos.X + h.V.Step.Width;
      pos.Y = pos.Y + h.V.Step.Height;
      h.CurPos = pos;
      h.V.Object.style.left = (pos.X) + "px";
      h.V.Object.style.top = (pos.Y) + "px";
      h.V.Object.style.width = wz + "px";
      h.V.Object.style.height = hz + "px";
      h.Size = [wz, hz];
      h.V.StepHidden(h.V.Object, {});
      h.Timer = setTimeout(function() {
        ZoomHide(h);
      }, h.V.Time);
    }
    else {
      ActualHide(h);
      //h.V.Object.width = "";
      //h.V.Object.height = "";
      h.V.Object.style.width = h.ResetW ? "" : h.V.ObjWidth + "px";
      h.V.Object.style.height = h.ResetH ? "" : h.V.ObjHeight + "px";
      RemoveHash(h.I);
      h.Timer = 0;
      h.V.HideComplete(h.V.Object, {});
    }
  };
  function ActualShow(h) {
    if (h.V.Vision == 'D') {
      h.V.Object.style.display = 'block';
    }
    else
      if (h.V.Vision == 'V') {
      h.V.Object.style.visibility = 'visible';
    }
    //h.Timer = 0;        
    //if (h.V.Type == '2') {
    // for (var i = 0; i < h.V.Object.childNodes.length; i++) {
    //h.V.Object.childNodes[i].style.display = 'none';
    //}
    //}

  };
  function Show(h) {
    var ext = h.Exist;
    if (ext != null) {
      if (ext.Timer) {
        window.clearTimeout(ext.Timer);
        ext.Timer = 0;
      }
    }
    h.V.Object.style.overflow = "hidden";
    switch (h.V.Type) {
      case '0':
        h.V.ShowComplete(h.V.Object, {});
        break;
      case '1':
        if (ext == null) {
          h.R = h.V.MinSize;
        }
        else {
          h.R = ext.R;
        }
        BackgroundShow(h);
        break;
      case '2':
        if (ext == null) {
          h.Index = h.V.MinSize;
          var cs = h.V.Object.childNodes;
          for (var ci = 0; ci < cs.length; ci++) {
            var n = cs[ci];
            if (n.nodeType == 1)
              n.style.display = "none";
          }
        }
        else {
          h.Index = ext.Index;
        }

        ChildShow(h);
        break;
      case '3':
        if (!CheckProperty(h.V.ObjHeight, 'ObjHeight')) {
          RemoveHash(h.I);
          return;
        }
        if (ext == null) {
          h.V.Object.style.height = '0px';
          h.Size = h.V.MinSize;
        }
        else {
          h.V.Object.style.height = ext.V.Object.style.height;
          h.Size = ext.Size;
        }
        HeightShow(h);
        break;
      case '4':
        if (!CheckProperty(h.V.ObjWidth, 'ObjWidth')) {
          RemoveHash(h.I);
          return;
        }
        if (ext == null) {
          h.Size = h.V.MinSize;
          h.V.Object.style.width = '0px';
        }
        else {
          h.Size = ext.Size;
          h.V.Object.style.width = ext.V.Object.style.width;
        }
        WidthShow(h);
        break;
      case '5':
        if (!CheckProperty(h.V.ObjWidth, 'ObjWidth') || !CheckProperty(h.V.ObjHeight, 'ObjHeight')) {
          RemoveHash(h.I);
          return;
        }
        if (ext == null) {
          h.V.Object.style.height = '0px';
          h.V.Object.style.width = '0px';
          h.Size = [h.V.MinSize.Width, h.V.MinSize.Height];
        }
        else {
          h.V.Object.style.height = ext.V.Object.style.height;
          h.V.Object.style.width = ext.V.Object.style.width;
          h.Size = ext.Size;
        }
        WidthAndHeightShow(h);
        break;
      case '6':
        if (!CheckProperty(h.V.ObjWidth, 'ObjWidth') || !CheckProperty(h.V.ObjHeight, 'ObjHeight')) {
          RemoveHash(h.I);
          return;
        }
        if (ext == null) {
          h.CurPos = Library.WebControl.Util.GetPosition(h.V.Object);
          //var curSize = Library.WebControl.Util.GetSize(h.V.Object);
          h.CurPos = {
            X: h.CurPos.X + /*curSize.W*/h.V.ObjWidth / 2,
            Y: h.CurPos.Y + /*curSize.H*/h.V.ObjHeight / 2
          };
          //h.V.Step = //{Width:}
          h.V.Object.style.height = '0px';
          h.V.Object.style.width = '0px';
          h.Size = [h.V.MinSize.Width, h.V.MinSize.Height];

        }
        else {
          h.V.Object.style.height = ext.V.Object.style.height;
          h.V.Object.style.width = ext.V.Object.style.width;
          h.Size = ext.Size;
          h.CurPos = ext.CurPos;
        }
        h.V.Step = ScaleSize({
          W: h.V.ObjWidth,
          H: h.V.ObjHeight
        }, h.V.OriStep);
        ZoomShow(h);
        break;
    }

  };
  function WidthShow(h) {
    if (h.Size < h.V.ObjWidth) {
      h.Size += h.V.Step;
      if (h.Size > h.V.ObjWidth)
        h.Size = h.V.ObjWidth;
      h.V.Object.style.width = h.Size + 'px';
      h.V.StepShown(h.V.Object, {});
      h.Timer = setTimeout(function() {
        WidthShow(h);
      }, h.V.Time);

    }
    else {
      if (h.ResetW)
        h.V.Object.style.width = "";
      RemoveHash(h.I);
      h.Timer = 0;
      h.V.Object.style.overflow = h.V.OverFlow;
      h.V.ShowComplete(h.V.Object, {});
    }
  };
  function HeightShow(h) {
    if (h.Size < h.V.ObjHeight) {
      h.Size += h.V.Step;
      if (h.Size > h.V.ObjHeight)
        h.Size = h.V.ObjHeight;
      h.V.Object.style.height = h.Size + 'px';
      h.V.StepShown(h.V.Object, {});
      h.Timer = setTimeout(function() {
        HeightShow(h);
      }, h.V.Time);
      return;
    }
    else {
      if (h.ResetH)
        h.V.Object.style.height = "";
      RemoveHash(h.I);
      h.Timer = 0;
      h.V.Object.style.overflow = h.V.OverFlow;
      h.V.ShowComplete(h.V.Object, {});
    }
  };
  function WidthAndHeightShow(h) {
    if (h.Size[0] < h.V.ObjWidth || h.Size[1] < h.V.ObjHeight) {
      if (h.Size[0] < h.V.ObjWidth) {
        h.Size[0] += h.V.Step.Width;
      }
      if (h.Size[1] < h.V.ObjHeight) {
        h.Size[1] += h.V.Step.Height;
      }
      if (h.Size[0] > h.V.ObjWidth)
        h.Size[0] = h.V.ObjWidth;
      if (h.Size[1] > h.V.ObjHeight)
        h.Size[1] = h.V.ObjHeight;
      h.V.Object.style.width = h.Size[0] + 'px';
      h.V.Object.style.height = h.Size[1] + 'px';
      h.V.StepShown(h.V.Object, {});
      h.Timer = setTimeout(function() {
        WidthAndHeightShow(h);
      }, h.V.Time);

    }
    else {
      if (h.ResetW)
        h.V.Object.style.width = "";
      if (h.ResetH)
        h.V.Object.style.height = "";
      RemoveHash(h.I);
      h.Timer = 0;
      h.V.Object.style.overflow = h.V.OverFlow;
      h.V.ShowComplete(h.V.Object, {});
    }
  };
  function ChildShow(h) {
    if (h.Index < h.V.Object.childNodes.length) {
      var n = h.V.Object.childNodes[h.Index];
      if (n.nodeType == 1)
        n.style.display = 'block';
      h.Index++;
      h.V.StepShown(h.V.Object, {});
      h.Timer = setTimeout(function() {
        ChildShow(h);
      }, h.V.Time);
    }
    else {
      RemoveHash(h.I);
      h.Timer = 0;
      h.V.Object.style.overflow = h.V.OverFlow;
      h.V.ShowComplete(h.V.Object, {});
    }
  };
  function BackgroundShow(h) {
    if (h.R < 100) {
      h.R += h.V.Step;
      var d = h.V.Object;
      d.style.filter = 'alpha(opacity=' + h.R + ')';
      if (h.R < 100) {
        if (h.R > 9) {
          d.style.opacity = '0.' + h.R;
        }
        else {
          d.style.opacity = '0.0' + h.R;
        }
        h.V.StepShown(h.V.Object, {});
        h.Timer = setTimeout(function() {
          BackgroundShow(h);
        }, h.V.Time);
      }
      else {
        d.style.opacity = '1.0';
        d.style.filter = '';
        RemoveHash(h.I);
        h.Timer = 0;
        h.V.ShowComplete(h.V.Object, {});
      }
    }
    else {
      RemoveHash(h.I);
      h.Timer = 0;
      h.V.ShowComplete(h.V.Object, {});
    }
  };
  function ZoomShow(h) {
    var wz = h.Size[0] + 2 * h.V.Step.Width;
    var hz = h.Size[1] + 2 * h.V.Step.Height;
    if (wz <= h.V.ObjWidth && hz <= h.V.ObjHeight) {
      h.V.Object.style.width = wz + "px";
      h.V.Object.style.height = hz + "px";
      h.Size = [wz, hz];
      h.CurPos = {
        X: h.CurPos.X - h.V.Step.Width,
        Y: h.CurPos.Y - h.V.Step.Height
      };
      h.V.Object.style.top = h.CurPos.Y + "px";
      h.V.Object.style.left = h.CurPos.X + "px";
      h.V.StepShown(h.V.Object, {});
      h.Timer = setTimeout(function() {
        ZoomShow(h);
      }, h.V.Time);

    }
    else {
      h.V.Object.style.width = h.ResetW ? "" : h.V.ObjWidth + "px";
      h.V.Object.style.height = h.ResetH ? "" : h.V.ObjHeight + "px";
      RemoveHash(h.I);
      h.Timer = 0;
      h.V.Object.style.overflow = h.V.OverFlow;
      h.V.ShowComplete(h.V.Object, {});
    }
  };
  function Create(o) {
    var h = SetDefault(o);
    //h.OriSize = Library.WebControl.Util.GetSize(h.V.Object);
    return {
      Show: function() {
        h.Exist = null;
        if (h.Timer > 0) {
          h.Exist = h;
        }
        ActualShow(h);
        h.OriSize = Library.WebControl.Util.GetSize(h.V.Object);
        h.V.ObjHeight = h.OriSize.H;
        h.V.ObjWidth = h.OriSize.W;

        Show(h);
      },
      Hide: function() {
        h.Exist = null;
        if (h.Timer > 0) {
          h.Exist = h;
        }
        else {
          h.OriSize = Library.WebControl.Util.GetSize(h.V.Object);
        }

        h.V.ObjHeight = h.OriSize.H;
        h.V.ObjWidth = h.OriSize.W;
        Hide(h);
      }

    };

  };
  return {
    Show: function(o) {
      var h = SetDefaultObj(o);
      //if (!h.V.ShowComplete) {
      //  h.V.ShowComplete = function(s, e){
      //};
      //}
      ActualShow(h);
      Show(h);
    },
    Hide: function(o) {
      var h = SetDefaultObj(o);
      //if (!h.V.HideComplete) {
      // h.V.HideComplete = function(s, e){
      //};
      // }
      Hide(h);
    },
    Create: function(o) {
      return Create(o);
    }
  }
} ());
